// 封装请求模块

import axios from "axios"
import { useUserStore } from "@/stores/user";
import router from "@/router/index"
import { ElMessage } from "element-plus";

// 创建并导出axios实例
// -- 后续仅需传递分页地址
export const instance = axios.create({
    baseURL: 'http://localhost:4000/api',
    timeout: 5000,
});

// 状态表示常量(增强代码可读性)
const RESPONSE_STATUS = {
  succeed: 10000, // 成功
  Unauthorized: 401, // 认证过期
}


// 创建拦截器
// -- 请求拦截器
instance.interceptors.request.use((config) => {
    // 创建pinia仓库实例
    const userStore = useUserStore()
    // 为请求添加请求头
    // -- 由于后续请求均需要携带token，因此在此处统一添加请求头
    config.headers.Authorization = `Bearer ${userStore.token}`

    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// -- 响应拦截器
instance.interceptors.response.use( (response) => {
    // 对成功响应的数据做公共处理（响应成功！=登陆成功）

    // 解构出所需的响应数据
    const {data: resp} = response
    const {code, data, message} = resp

    // 校验登录状态
    if(code === RESPONSE_STATUS.succeed) {
      // 登陆成功
      return data
    } else {
      // 登录失败
      // 返回失败态的Promise1实例,携带失败信息
      return Promise.reject(new Error(message))
    }
  }, function (error) {
    // 对失败响应做处理
    // 对token过期做处理

    // 1.从error中解构出状态码
    const {status} = error.response
    // 2.判断状态码是否为401
    if(status === RESPONSE_STATUS.Unauthorized) {
      // 创建pinia仓库实例
      const userStore = useUserStore()

      // 3.弹出提示信息
      ElMessage({
        message: "认证信息过期，请重新登录！",
        type: "error"
      })
      // 4.清空所有登录信息（不清空无法跳转至登录页）
      userStore.logout()
      // 5.将路由跳转至登录页（保留回跳地址）
      // -- 获取当前路由地址
      const {currentRoute: {_value: {path}}} = router
      // -- 跳转至登录页
      router.push(`/login?comebackUrl=${path}`)

    }
    return Promise.reject(error);
});

